package DoublyLinkedList

import (
	node "go_algorithm/2_Linklist/Node"
)

type DoublyLinkedList struct {
	Head   *node.Node //头节点
	Tail   *node.Node //尾节点
	Length int        // 长度
}

// 初始化链表
func Init() *DoublyLinkedList {
	return &DoublyLinkedList{}
}

// 尾部插入
func (ddl *DoublyLinkedList) Push(value int) {
	node := &node.Node{Value: value}
	if ddl.Head == nil {
		ddl.Head = node // 头节点为空，则新节点为头节点
		ddl.Tail = node // 尾节点为头节点
		ddl.Length++
	} else {
		node.Prev = ddl.Tail // 新节点的前置节点为尾节点
		ddl.Tail.Next = node // 尾节点的后置节点为新节点
		ddl.Tail = node      // 更新尾节点
		ddl.Length++
	}
	return
}

// 删除尾部节点
func (ddl *DoublyLinkedList) Pop() *node.Node {
	node := ddl.Tail
	if node == nil {
		return nil
	}
	ddl.Tail = node.Prev // 更新尾节点
	ddl.Length--
	return node
}

// 删除指定节点
func (ddl *DoublyLinkedList) DeleteVale(target int) bool {
	node := ddl.Head
	if node == nil {
		return false
	}
	for node != nil {
		if node.Next.Value == target {
			node.Next.Prev = node
			node.Next = node.Next.Next
			ddl.Length--
			return true
		}
		node = node.Next
	}
	return false
}

// 插入到指定位置
func (ddl *DoublyLinkedList) Insert(Target int, value int) bool {
	t_node := ddl.Head
	if t_node == nil {
		return false
	}
	for t_node != nil {
		if t_node.Value == Target {
			Insert_node := node.Node{Value: value}
			Insert_node.Next = t_node.Next
			t_node.Next.Prev = &Insert_node
			t_node.Next = &Insert_node
			Insert_node.Prev = t_node
			ddl.Length++
			return true
		}
		t_node = t_node.Next
	}
	return false
}

// 打印
func (ddl *DoublyLinkedList) Print() {
	node := ddl.Head
	for node != nil {
		println(node.Value)
		node = node.Next
	}
}

//逆序遍历链表
func (ddl *DoublyLinkedList) ReversePrint() {
	node := ddl.Tail
	for node != nil {
		println(node.Value)
		node = node.Prev
	}
}